import time
import random
import signal

from queue import Queue
from threading import Thread


signal.signal(signal.SIGINT, signal.SIG_DFL)

class Producer(Thread):

    def __init__(self, queue):
        super().__init__()
        self.queue = queue

    def run(self):
        while 1:
            self.queue.put(random.randint(1, 100))
            print("当前队列长度:", self.queue.qsize())
            time.sleep(1)


class Consumer(Thread):
    def __init__(self, queue):
        super().__init__()
        self.queue = queue
    def run(self):
        while 1:
            item = self.queue.get(block=True)
            print("Consumer->" + str(item))
            time.sleep(4)

if __name__ == "__main__":
    q = Queue()
    p = Producer(q)
    c = Consumer(q)
    p.start()
    c.start()
    c.join()


"""
NOTE:
如果使用Python自带的队列，就会出现以上的疑问。因为开发者不
能直接看到队列的长度。如果开发者一开始就考虑到“需要随时观察队
列长度”这个需求，那么可以通过对代码做一些修改来实现。但如果一
开始没有打算观察队列长度，仅仅是临时起意，那该怎么办？
如果不仅想看队列长度，还想看里面每一组数都是什么，又该如何
操作？
假设队列里已经堆积了一百组数，现在想增加消费者，该怎么增
加？
如再运行一个Python程序，那能去读第一个正在运行中的Python程
序中的队列吗？
Python 把队列中的数据存放在内存中。如果电脑突然断电，那队列
里的数是不是全都丢失了？
为了防止丢数据，是否需要把数据持久化到硬盘？那持久化的代码
怎么写，代码量有多少，考不考虑并发和读写冲突？
为了解决上述问题，在代码2-1的基础上，代码量要翻倍翻倍再翻
倍
"""